﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModeloGaleriaNET;
using System.Data.Objects;

namespace CADs
{
    public class ObraCAD : BaseCAD
    {
        private int queryCount;
        private List<ObraFilter> filtros;

        public ObraCAD()
            : base()
        {
            filtros = new List<ObraFilter>();
        }

        public List<Obra> GetAllObra()
        {
            return contexto.Obras.Where(o => o.Activo).OrderBy(o => o.Id).ToList();
        }

        public void SetQueryFilters(List<ObraFilter> filters)
        {
            if (filters == null || filters.Count == 0)
            {
                filtros.Clear();
                this.filtros = new List<ObraFilter>();
                filtros.Add(new ObraFilter(@"it.activo = true"));
            }
            else
                this.filtros = filters;
        }

        public List<Obra> GetObrasPaginated(int pagenum = 0)
        {
            int pagesize = int.Parse(Properties.Resources.PageSize);

            ObjectQuery<Obra> query = contexto.Obras;
            query.MergeOption = MergeOption.OverwriteChanges;

            foreach (var filtro in filtros)
                query = query.Where(filtro.Condition, filtro.Parameters.ToArray());
            queryCount = query.Count();

            return query.Skip("it.Id", "@Skip", new ObjectParameter("Skip", pagenum * pagesize))
                        .Top("@Limit", new ObjectParameter("Limit", pagesize))
                        .ToList();
        }

        public int GetObrasCount()
        {
            return queryCount;
        }

        public Obra GetObraByNombreAutorAnyo(string nombre, string autor, int anyo)
        {
            IQueryable<Obra> obras;
            obras = contexto.Obras.Where(o => o.Activo && o.Nombre.Equals(nombre) && o.Autor.Equals(autor) && o.Anyo == anyo);
            return obras == null || obras.Count() == 0 ? null : obras.First();
        }

        public Obra GetObraById(int? id)
        {
            IQueryable<Obra> obras;

            if (id == null)
                return null;

            obras = contexto.Obras.Where(o => o.Activo && o.Id == id);
            return obras == null || obras.Count() == 0 ? null : obras.First();
        }

        public bool GuardarNuevaObra(Obra o)
        {
            try
            {
                contexto.AddToObras(o);
                SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool BorrarObra(Obra o)
        {
            try
            {
                o.Activo = false;
                SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool GuardarCambios()
        {
            try
            {
                SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public dynamic GetObrasIdNombreAutor()
        {
            return contexto.Obras.Where(o => o.Activo == true).ToList().Select(o => new { o.Id, o.NombreAutor })
                .OrderBy(o => o.NombreAutor);
        }

        public dynamic GetObrasIdNombreAutorNoSubastadas()
        {
            List<Obra> obras;
            obras = contexto.Obras.Where(o => o.Activo == true).ToList();
            obras = obras.Where(o => o.ClientePropietarioObraActual != null && o.ClientePropietarioObraActual.SubastaActual == null).ToList();
            return obras.Select(o => new {o.Id, o.NombreAutor}).OrderBy(o => o.NombreAutor);
        }

        public dynamic GetObrasIdNombre()
        {
            return contexto.Obras.Where(o => o.Activo == true).ToList().Select(o => new { o.Id, o.Nombre })
                .OrderBy(c => c.Nombre);
        }
    }
}
